//============================================================================================
/**
 * @file	phclink_local.h
 * @brief	ＰＨＣ−ＤＳ接続画面アプリ専用ヘッダ
 * @author	Akito Mori
 * @date	09.01.29
 */
//============================================================================================
#ifndef __PHCLINK_LOCAL_H__
#define __PHCLINK_LOCAL_H__


#include "savedata/phc_svdata.h"
#include "savedata/zukanwork.h"
#include "phc/phc_lib.h"
#include "system/touch_subwindow.h"
#include "poketool/poke_tool.h"
#include "system/softsprite.h"
#include "phclink_bmp_def.h"
#include "phclink_obj_def.h"
#include "application/poke_select.h"
#include "phclink_sel_sub.h"
#include "application/phc_diary.h"

///< 会話ウインドウ用バッファ長
#define PHCLINK_TALKMSG_MAX	(26*6*2)

///< フォントパレット位置
#define PHCLINK_TALK_FONT_PAL	( 14 )

///< 会話ウィンドウキャラ定義
#define	TALK_WIN_CGX_SIZE	( 18+12 )		///< キャラサイズ
#define	TALK_WIN_CGX_NUM	( 1024 - TALK_WIN_CGX_SIZE )	///< キャラ位置
#define	TALK_WIN_PAL		( 13 )			///< パレット

#define CLACT_RESOURCE_NUM	(  4 )  ///< マルチセルは使用しない
#define RES_NUM				(  2 )	///< 読み込みリソースの数

///< u8 3バイトの配列をシフトして一つの数値にするマクロ
#define BYTE3_TO_INT(a) (a[0]|(a[1]<<8)|(a[2]<<16))


///< 指定の表示はどっちのLCDに影響するか？
enum{
	BMP_MAIN_LCD=0,		// メイン面
	BMP_SUB_LCD			// サブ面
};

// メインループ用（遷移用）
//
// PHCアプリにはメインループ
//　　　　　　　サブシーケンス
//　　　　　　　アプリシーケンス
// の3段階のシーケンス制御が存在します。
enum {
	SEQ_IN = 0,			///< 開始フェードイン
	SEQ_MAINSEQ_INIT,	///< メイン
	SEQ_MAINSEQ_MAIN,	///< メイン
	SEQ_MAINSEQ_END,	///< メイン
	SEQ_OUT,			///< フェードアウト
};

#define PHC_STACK_SIZE			(0x1000)	///< PHCライブラリに渡すワークサイズ
#define PHC_THREAD_PRIORITY		( 15 )		///< スレッドプライオリティ

///< PHC初期化時に歩数をクリアするかどうか
enum{
	PHC_TOTALSTEP_NO_CLEAR=0,
	PHC_TOTALSTEP_CLEAR,
};

///< PHCレコードデータ（トレーナーハウスデータ）の数
#define PHC_TR_HOUSE_NUM		( 10 )

///< 定義を有効にするとセーブしなくなる
//#define PHC_NO_SAVE

///< サブ画面に入った時の分岐に使うsubseq_flagの意味
enum{
	SENDRECV_SEND=0,
	SENDRECV_RECV,
	SENDRECV_RECV_PRESENT,
	SENDRECV_RECV_ONLY_POKEMON,
	RECVDEMO_OBLIGATE_RECV,

};

///< タッチパネル検出時のモード指定
enum{
	PHC_TOUCH_YESNO_MODE=0,	///< はい・いいえ
	PHC_TOUCH_1_1_MODE,		///< 1択ともどる
	PHC_TOUCH_2_1_MODE,		///< 2択と戻る
	PHC_TOUCH_3_1_MODE,		///< 3択と戻る
	PHC_TOUCH_COURSE_MODE,	///< コース選択
	PHC_TOUCH_CANCEL_MODE,	///< 通信待機中でもどるだけ
};


// ------------------------------------------------
///< PHCシステム用構造体
typedef struct PHC_SYS_WORK_tag{
	u8 stack[PHC_STACK_SIZE];

	//   ---------------------------
	///< 送信用
	ALIGN4 PHCStatus myStatusDS;		///< 自分側ＰＨＣデータ
	ALIGN4 PHCStatus myStatusPHC;		///< PHC内データ取得用ワーク
	PHCImageData myImageData;			///< PHC初期化用イメージデータ
	// ---------------------------


	// ---------------------------
	///< 引き取り用
	PHCRentalData Rental;			///< 引き取り時ポケモンデータ
	PHCData Data;					///< 引き取り用PHC内作成データ
	PHCDistributeData Distribute;	///< 配布地図データ
	DSRecordData Record[PHC_TR_HOUSE_NUM+1];	///< レコードデータ
	// ---------------------------

	PHCCourseData myCourse;			///< コースデータ送信用
	DSRecordData myRecord;			///< レコードデータ送信用

	PHCRentalData myRental;			///< 現在預け中のポケモン情報
	PHCData myPHCData;				///< PHC通信時ワーク
	PHCDistributeData myDistribute;	///< 配布データ

	ALIGN4 u8 compressBuffer[PHC_COMPRESS_BUFFER_SIZE]; ///< データ圧縮用ワーク

	PHC_DIARY_PARAM	diary_param;	///< 日記用パラメータ

	u32		old_total_step;			///< セーブデータから引っ張ってきて比較に使用する総歩数
	u32		old_total_wat;			///< セーブデータから引っ張ってきて比較に使用する総ワット数
	u16		proces_total;			///< 通信状況判定用ワーク
}PHC_SYS_WORK;

#define POKEMON_SELECT_MAX	( 1 )

///< コース選択肢はオープンしているコースが詰めて表示するためのワークの最大
#define COUSE_SELECT_MENUITEM_MAX	( 30 )

///<
#define PHCLINK_COURSE_MAX			( 27 )

// ------------------------------------------------
///< PHC用ポケモン選択画面用ワーク構造体
typedef struct PHC_POKE_SEL_WORK_tag{
	int Seq;	///< シーケンス管理用ワーク
	POKE_SELECT_WORK_PTR PokeSelPtr;	///< ポケモン選択画面用ワーク
	PLNKS_CNT_PTR SubCntPtr;			///< ポケモン選択画面コントローラ
	SELECT_RESULT_INFO	 SelectResult[POKEMON_SELECT_MAX];	///< 選択結果格納配列
	BOOL SelectCancel;	///< キャンセルフラグ
	u16  monsno;		///< 選択するポケモンの数
	STRCODE monsname[MONS_NAME_SIZE+EOM_SIZE];	///< 選択したポケモンの名前
	u8   form;	///< フォルム
	u8   rare;	///< レア
	u8   sex;	///< 性別
	u8   etc;	///<
	int  course;///< コース
}PHC_POKE_SEL_WORK;

#define POKEGRA_SIZE  ( 0x20*10*10 )	///< ポケモン正面絵のグラフィックキャラサイズ

///< PHC-DS接続画面ワーク
typedef struct PHCLINK_WORK_tag{
	int			mainseq;			///< 各画面切り替え遷移用
	int			mainseq_next;		///< 切り替え予約用

	int			subseq;				///< 各画面内でのサブシーケンス管理用
	int			subseq_next;		///< サブシーケンス予約用
	int			subseq_flag;		///< シーケンスの分岐に使用する
	u16			error_msg;			///< エラー発生時の表示用
	u16			connect_msg;		///< PHC接続時のメッセージ表示切替

	GF_BGL_INI	*bgl;				///< GF_BGL_INI
	PROC		*proc;				///< スタータス呼び出し用サブプロセスデータ
	SAVEDATA    *savedata;			///< セーブデータ
	PHC_SYS_WORK	phcsys;			///< PHCシステムワーク
	PHC_POKE_SEL_WORK phcsel;		///< ポケモン選択画面用ワーク
	SOFT_SPRITE_ARC PokeGraSsa;		///< ポケモン正面絵展開用ワーク
	u8			PokeGra[POKEGRA_SIZE];	///< ポケモングラフィック展開バッファ
	POKEMON_PARAM		*pp;		///< PHCから返ったポケモンのポインタ
	POKEMON_PASO_PARAM	*ppp;		///< PPPでしか確保できない場合のポケモンポインタ

	MYITEM  	*myitem;			///< 主人公が持っているどうぐのセーブデータ
	MYSTATUS 	*mystatus;			///< 主人公ステータス
	CONFIG    	*config;			///< せってい情報
	PHC_SVDATA	*phc_svdata;		///< PHC関連セーブデータ
	ZUKAN_WORK  *zukan;				///< 図鑑データ

	// 文字描画まわり（主にBMP用の文字列周り）
	WORDSET			*wset;			///< メッセージ展開用ワークマネージャー
	MSGDATA_MANAGER *msg_man;		///< 名前入力メッセージデータマネージャー
	MSGDATA_MANAGER *item_man;		///< 名前入力メッセージデータマネージャー

	// 主に通信前後(下画面）
	STRBUF	*TalkStr;					///< 会話メッセージ用
	STRBUF	*SelectStr[PL_STRING_MAX];	///< タイトルメッセージ用
	STRBUF	*DecideStr;					///< タイトルメッセージ用
	STRBUF	*BackStr;					///< タイトルメッセージ用
	STRBUF	*PlaceNameStr[6];			///< マップ名表示用
	STRBUF	*PageNumStr;				///< ページ数用

	// 探検結果画面（下画面）
	STRBUF	*TodayResultStr;		///< 「きょうのおでかけ」
	STRBUF	*PresentResultStr;		///< 「プレゼントのけっか」
	STRBUF	*SendResultStr;			///< 「いままでのおでかけ」
	STRBUF	*PokemonResultStr;		///< 「つかまえたポケモン」
	STRBUF	*ItemResultStr;			///< 「ていにれたどうぐ」
	STRBUF	*ResultStr[3];			///< 結果関連ｘ３
	STRBUF	*StillWalkStr;			///< 「いままでのほすう」
	STRBUF	*StillWalkNumStr;		///<
	STRBUF	*StillWatStr;			///< 「いままでのワット」
	STRBUF	*StillWatNumStr;		///<
	STRBUF	*PokeNameStr[4];		///< 手にいれたポケモン名
	STRBUF  *ItemNameStr[14];		///< 手にいれたどうぐ名
	STRBUF	*WalkTotalStr;			///< 総歩数
	STRBUF	*WatTotalStr;			///< 総ワット
	STRBUF	*YesNoStr[2];			///< 「はい」「いいえ」

	// 場所指定画面用（上画面）
	STRBUF	*PlaceNameUStr;			///< おでかけするコース名
	STRBUF	*PlaceExplainStr;		///< コース説明
	int		MsgIndex;				///< 終了検出用ワーク


	// 描画周りのワーク（主にOAM)
	CATS_SYS_PTR		csp;		///< セルアクターシステム
	CATS_RES_PTR		crp;		///< セルアクターリソースシステム
	CATS_ACT_PTR		cap[PHCLINK_ALL_OBJ_MAX];	///< セルアクターポインタ

	// 描画周りのワーク（主にOAM)
	CLACT_SET_PTR 			clactSet;					///< セルアクターセット
	CLACT_U_EASYRENDER_DATA	renddata;					///< 簡易レンダーデータ
	CLACT_U_RES_MANAGER_PTR	resMan[CLACT_RESOURCE_NUM];	///< リソースマネージャ
	CLACT_U_RES_OBJ_PTR 	resObjTbl[RES_NUM][CLACT_RESOURCE_NUM]; ///< リソースオブジェテーブル
	CLACT_HEADER			clActHeader_main;			///< セルアクターヘッダー
	CLACT_HEADER			clActHeader_sub;			///< セルアクターヘッダー
	CLACT_HEADER			clActHeader_friend;			///< セルアクターヘッダー
	CLACT_WORK_PTR			CursorActWork;				///< セルアクターワークポインタ配列

	void*					PokeIconBuf;				///< ポケモンアイコンバッファポインタ
	NNSG2dCharacterData*	PokeIconCharaDat;			///< ポケモンアイコン画像ポインタ


	// BMPWIN
	GF_BGL_BMPWIN			MainBmpWin[20];				///< メイン画面のBMPWIN
	GF_BGL_BMPWIN			SubBmpWin[10];				///< サブ画面のBMPWIN
	u8						NowBmpWinNum[2];			///< BMPWINを確保した数（メイン・サブ）
	u8						NowBmpWinSet[2];			///< BMPWINを確保した数（メイン・サブ）
	void 					*TimeWaitIconPtr;			///< セーブ待ちアイコンのアニメタスク用ポインタ

	// インターフェース周り用変数
	int						cursor_pos;					///< カーソル位置
	int						page;						///< ページ位置
	s8						menuitem[COUSE_SELECT_MENUITEM_MAX];///< コースメニュー用
	u16						menumax;					///< 項目最大数

	// コース到達通知用ワーク
	u32						open_course_id;				///< 今回オープンしたコース（普段は0)

	// 歩数の差
	int						step_difference;			///< 預けている間に歩いた歩数の差分


	// エフェクト用ワーク
	PHC_LIGHT_WORK			light[PHC_LIGHT_MAX];		///< たくさんの光
	PHC_LIGHT_WORK			pokelump;					///< ポケモンの光
	int						time;						///< 開始からのSYNC数
	u16						pokelump_flag;				///< 白玉出すかフラグ
	u16						blend_rate;					///< ポケモン正面絵の半透明度指定
	TCB_PTR					blend_task;					///< 半透明制御タスクポインタ
	TCB_PTR					scrol_task;					///< BGスクロール制御タスクポインタ
	u16						Bg1SubHOffset;				///< 上画面BG1オフセット操作用変数

	///< はい・いいえ制御用
	u16						yesno_seq;					///< はい・いいえシーケンス
	u16						clear_step;					///< 初期化時に歩数をクリアするか（

	///< 初期化時のポケモン復帰用ワーク
	u32 					pokepaso[136/4];
	s16						box, pos;					///<ボックスNO,場所

	///< 引き取り時にレベルアップしたか
	u16						levelup;

	///< PHCでエンディングをみた
	u16						ending_flag;
}PHCLINK_WORK;


///< サブシーケンスの指定用定義( wk->mainseqに代入する）
enum{
	MAINSEQ_START=0,		///< スタート
	MAINSEQ_ERROR,          ///< できない
	MAINSEQ_INITIALIZE,     ///< PHC初期化
	MAINSEQ_SENDRECV,       ///< PHCに送信
	MAINSEQ_EXTRADITION,    ///< 強制送還
	MAINSEQ_SEND_DEMO,      ///< PHC送信デモ
	MAINSEQ_RECV_DEMO,      ///< PHC受信デモ
	MAINSEQ_POKE_SELECT,    ///< ポケモン選択
	MAINSEQ_DIARY,          ///< 日記
	MAINSEQ_MAP_SELECT,     ///< マップ選択
	MAINSEQ_BENEFIT,		///< 報酬画面

	MAINSEQ_END_PHC,		///< 終了
};


enum{
	PHCLINK_NO_INIT=0,			// PHCを初期化した事がない
	PHCLINK_ALREADY_ENTRY,		// 初期化してあってPHCに預けてある
	PHCLINK_ALREADY_NO_ENTRY,	// 初期化してあってPHCに預けてはいない
};

// phclink.c内の関数（主にツール群）
extern void PhcLink_BgGraphicSet( PHCLINK_WORK *wk, int frame, int screen_no );
extern void PhcLink_IrcSystemInit( PHCLINK_WORK *wk );
extern void PhcLink_IrcSystemExit( PHCLINK_WORK *wk );

extern void PhcLink_ResourceInit( PHCLINK_WORK *wk );
extern void PhcLink_ResourceExit( PHCLINK_WORK *wk );

extern void PhcLink_IRCInitSetup( PHCLINK_WORK *wk );
extern void PhcLink_IRCSendSetup( PHCLINK_WORK *wk );

extern int PhcLink_TransPokeGra( POKEMON_PASO_PARAM *ppp, u8 *char_work, SOFT_SPRITE_ARC *ssa, int flag );
extern  int PhcLink_GetPhcMode( PHCLINK_WORK *wk);
extern void PhcLink_OpenCourseCheck( PHCLINK_WORK *wk );

extern void PhcLinkBmp_YesnoInit( PHCLINK_WORK *wk, int first );
extern  int PhcLinkBmp_YesnoWait( PHCLINK_WORK *wk );
extern void PhcLinkBmp_StepClearYesnoInit( PHCLINK_WORK *wk, int first );


extern int PhcLink_SearchOpenCourse( PHCLINK_WORK *wk, int wat );
extern u32 PhcLink_GetTouchTrg( int index );

extern void PhcLink_BlendPokeInit( PHCLINK_WORK *wk );

extern void PhcLink_SetIrcExplainBg( PHCLINK_WORK *wk );
extern void PhcLink_SetIrcExplainVisible( PHCLINK_WORK *wk, int flag );

// グラフィック加工用関数群
void PhcLink_GraMakeBuchi( u8 *gra, const int monsno, const int rnd  );
int	PhcLink_GraArcDataGet( const int mons_no, int sex, int  form_no );



// 最初のメニュー分岐・ＰＨＣ状態判断
extern  int PhcLink_SeqStart_Init ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqStart_Main ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqStart_End( PHCLINK_WORK *wk );

// 通信できない時の画面
extern  int PhcLink_SeqError_Init ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqError_Main ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqError_End( PHCLINK_WORK *wk );

// PHC初期化画面
extern  int PhcLink_SeqInitialize_Init ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqInitialize_Main ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqInitialize_End( PHCLINK_WORK *wk );

// PHC赤外線送受信画面
extern  int PhcLink_SeqSendRecv_Init ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqSendRecv_Main ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqSendRecv_End( PHCLINK_WORK *wk );

// 強制送還時の画面
extern  int PhcLink_SeqExtradition_Init( PHCLINK_WORK *wk );
extern  int PhcLink_SeqExtradition_Main( PHCLINK_WORK *wk );
extern  int PhcLink_SeqExtradition_End( PHCLINK_WORK *wk );

// 送信デモ
extern  int PhcLink_SeqSendDemo_Init ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqSendDemo_Main ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqSendDemo_End( PHCLINK_WORK *wk );

// 受信デモ
extern  int PhcLink_SeqRecvDemo_Init ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqRecvDemo_Main ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqRecvDemo_End( PHCLINK_WORK *wk );
extern void PhcLink_GetPokeItemFunc( PHCLINK_WORK *wk );

extern void PhcLink_AddBg1ScrolTask( PHCLINK_WORK *wk );


// ポケモン選択
extern  int PhcLink_SeqPokeSelect_Init ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqPokeSelect_Main( PHCLINK_WORK *wk );
extern  int PhcLink_SeqPokeSelect_End( PHCLINK_WORK *wk );

// 日記
extern  int PhcLink_SeqDiary_Init ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqDiary_Main( PHCLINK_WORK *wk );
extern  int PhcLink_SeqDiary_End( PHCLINK_WORK *wk );

// マップセレクト
extern  int PhcLink_SeqMapSelect_Init ( PHCLINK_WORK *wk );
extern  int PhcLink_SeqMapSelect_Main( PHCLINK_WORK *wk );
extern  int PhcLink_SeqMapSelect_End( PHCLINK_WORK *wk );

// 探検結果画面
extern  int PhcLink_SeqBenefit_Init( PHCLINK_WORK *wk );
extern  int PhcLink_SeqBenefit_Main( PHCLINK_WORK *wk );
extern  int PhcLink_SeqBenefit_End( PHCLINK_WORK *wk );

extern void PhcLink_CursorAnimeStart( PHCLINK_WORK *wk, int pos, int cursor, int next );
extern void PhcLink_MsgStart( PHCLINK_WORK *wk, int winidx, int msg, int next );


#endif // __PHCLINK_LOCAL_H__